#include "Deklaracje.h"
#include <vector>
#include <list>

class Plansza;
class PlanszaWirtualna;

class Gracz
{
protected:
	Plansza * plansza;

	TURA identyfikator;	

	bool_ turaZakonczona;
public:
	TURA Id(){return identyfikator;};
	Gracz(Plansza *plansza, TURA id);
	bool_ StanTury(){return turaZakonczona;};
	virtual void RozpocznijTure() {turaZakonczona=false;};
	virtual void ObslugaMyszy(WSPOLRZEDNE_EKRANOWE wspolrzedne){;};
	virtual void ZapiszTH(){;};
	
};

class Czlowiek: public Gracz
{
public:
	Czlowiek(Plansza* plansza, TURA id): Gracz(plansza,id){;};
	void ObslugaMyszy(WSPOLRZEDNE_EKRANOWE wspolrzedne);

};

class Komputer: public Gracz
{
private:
	int sredniaLiczbaOdwiedzin;
	int liczbaOdwiedzin;
	int licznikUruchomien;
	std::vector<std::pair<int,RUCH>> tablicaHistorii;
	std::pair<int,RUCH> NegMax(PlanszaWirtualna model,int glebokosc, TURA gracz);
	std::pair<int,RUCH> AlphaBeta(PlanszaWirtualna model,int glebokosc, TURA gracz, std::pair<int,RUCH> alpha,  std::pair<int,RUCH> beta);
	std::pair<int,RUCH> AlphaBetaHT(PlanszaWirtualna model,int glebokosc, TURA gracz, std::pair<int,RUCH> alpha,  std::pair<int,RUCH> beta);
	int Ocena(PlanszaWirtualna model, int glebokosc);
	int glebokoscMax;
	int algorytm;
	void WypelnijTabliceHistorii();
	int czasMaks;
	std::list<RUCH> porzednieRuchy;
public:
	bool_ ograniczCzas;
	Komputer(Plansza* plansza, TURA id,int glebokosc,int algorytm, bool_ ograniczCzas=false);
	void ZapiszTH();
	void LadujTH();
	void RozpocznijTure();

};